XML文件解析dom4j.docx 您所在的位置:网站首页 dom4j selectnodes XML文件解析dom4j.docx

XML文件解析dom4j.docx

2023-03-29 21:42| 来源: 网络整理| 查看: 265

XML文件解析dom4j.docx

XML文件解析dom4j.docx

文档编号:1163507上传时间:2023-03-20格式:DOCX页数:21大小:23.43KB

XML文件解析dom4j

Dom4j学习笔记

LoadingXMLData

以下代码从File中或一个URL中读取一个XML文件,并产生一个Document对象。

一个Document对象表示了内存中的一棵XML树,可以在这个XML树中进行遍历、查询、修改等操作。

importjava.io.*;

import.*;

importorg.dom4j.Document;

importorg.dom4j.DocumentException;

importorg.dom4j.io.SAXReader;

publicclassXMLLoader{

privateDocumentdoc=null;

publicvoidparseWithSAX(Filefile)

throwsMalformedURLException,DocumentException{

SAXReaderxmlReader=newSAXReader();

this.doc=xmlReader.read(file);

return;

}

publicvoidparseWithSAX(URLurl)

throwsMalformedURLException,DocumentException{

SAXReaderxmlReader=newSAXReader();

this.doc=xmlReader.read(url);

return;

}

}

QNameandNamespace

QName对象表示了一个XML元素或属性的qualifiedname,即一个namespace和一个localname的二元组。

Namespace对象表示了QName二元组中的namespace部分,它由prefix和URI两部分组成。

/********************SAMPLEXMLFILE*************************

Sample

xmlns:

heavyz="

HelloWorld/>

Sample>

*************************************************************/

publicvoidprintRootQNameInfo(Documentdoc){

Elementroot=doc.getRootElement();

QNameqname=root.getQName();

System.out.println("localname:

"+qname.getName());

System.out.println("namespaceprefix:

"+qname.getNamespacePrefix());

System.out.println("namespaceURI:

"+qname.getNamespaceURI());

System.out.println("qualifiedname:

"+qname.getQualifiedName());

return;

}

/*************************OUTPUT*****************************

localname:

Sample

namespaceprefix:

heavyz

namespaceURI:

qualifiedname:

heavyz:

Sample

*************************************************************/

可以调用Namespace(Stringprefix,Stringuri)构造方法构造一个新的Namespace对象;也可以调用Namespace.get(Stringprefix,Stringuri)静态方法获得一个新的Namespace对象。

可以调用QName(Stringname)构造方法构造一个没有namespace的qualifiedname;或者调用QName(Stringname,Namespacenamespace)构造方法构造一个有namespace的qualifiedname。

NavigatingThroughanXMLTree

对Document对象调用getRootElement()方法可以返回代表根节点的Element对象。

拥有了一个Element对象后,可以对该对象调用elementIterator()方法获得它的子节点的Element对象们的一个iterator。

使用(Element)iterator.next()方法遍历一个iterator并把每个取出的元素转化为Element类型。

通过递归的方法,以下代码可以根据Document对象打印出完整的XML树。

publicvoidprintXMLTree(Documentdoc){

Elementroot=doc.getRootElement();

printElement(root,0);

return;

}

privatevoidprintElement(Elementelement,intlevel){

//printindent

for(inti=0;i

System.out.print("");

}

System.out.println(element.getQualifiedName());

Iteratoriter=element.elementIterator();

while(iter.hasNext()){

Elementsub=(Element)iter.next();

printElement(sub,level+2);

}

return;

}

GettingInformationfromanElement

可以通过Element类提供的方法访问一个XML元素中含有的信息:

Method

Comment

getQName()

元素的QName对象

getNamespace()

元素所属的Namespace对象

getNamespacePrefix()

元素所属的Namespace对象的prefix

getNamespaceURI()

元素所属的Namespace对象的URI

getName()

元素的localname

getQualifiedName()

元素的qualifiedname

getText()

元素所含有的text内容,如果内容为空则返回一个空字符串而不是null

getTextTrim()

元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null

attributeIterator()

元素属性的iterator,其中每个元素都是Attribute对象

attributeValue()

元素的某个指定属性所含的值

elementIterator()

元素的子元素的iterator,其中每个元素都是Element对象

element()

元素的某个指定(qualifiedname或者localname)的子元素

elementText()

元素的某个指定(qualifiedname或者localname)的子元素中的text信息

getParent

元素的父元素

getPath()

元素的XPath表达式,其中父元素的qualifiedname和子元素的qualifiedname之间使用"/"分隔

isTextOnly()

是否该元素只含有text或是空元素

isRootElement()

是否该元素是XML树的根节点

要取出Element对象中某个属性的信息,可以调用attributeIterator()方法获得一个Attribute对象的iterator,然后再遍历它。

也可以直接调用attributeValue()方法获得指定属性的值。

该方法接受四种类型的参数:

∙attributeValue(QNameqname):

通过指定qualifiedname获得属性值,如果无法找到指定的属性,则返回null。

∙attributeValue(QNameqname,StringdefaultValue):

通过指定qualifiedname获得属性值,如果无法找到指定的属性,则返回defaultValue。

∙attributeValue(Stringname):

通过指定localname获得属性值,而忽略属性的namespace,如果无法找到指定的属性,则返回null。

∙attributeValue(Stringname,StringdefaultValue):

通过指定localname获得属性值,而忽略属性的namespace,如果无法找到指定的属性,则返回defaultValue。

对于一个Attribute对象,可以使用它的以下方法访问其中的信息:

Method

Comment

getQName()

属性的QName对象

getNamespace()

属性所属的Namespace对象

getNamespacePrefix()

属性所属的Namespace对象的prefix

getNamespaceURI()

属性所属的Namespace对象的URI

getName()

属性的localname

getQualifiedName()

属性的qualifiedname

getValue()

属性的值

WritinganXMLTreetoOutputStream

Dom4j通过XMLWriter将由Document对象表示的XML树写入一个文件,并使用OutputFormat格式对象指定写入的风格和编码方法。

调用OutputFormat.createPrettyPrint()方法可以获得一个默认的prettyprint风格的格式对象。

对OutputFormat对象调用setEncoding()方法可以指定XML文件的编码方法。

publicvoidwriteTo(OutputStreamout,Stringencoding)

throwsUnsupportedEncodingException,IOException{

OutputFormatformat=OutputFormat.createPrettyPrint();

format.setEncoding("gb2312");

XMLWriterwriter=newXMLWriter(System.out,format);

writer.write(doc);

writer.flush();

return;

}

CreatinganXMLTree

使用DocumentFactory对象创建一个空的Document对象。

DocumentFactory对象由DocumentFactory.getInstance()静态方法产生。

对Document对象调用addElement()方法将创建XML根节点,并将该节点返回。

也可以手工创建一个Element对象并调用Document.setRootElement()方法把它设置为根节点

importorg.dom4j.DocumentFactory;

importorg.dom4j.Document;

importorg.dom4j.Element;

publicclassXMLSaver{

privateDocumentFactoryfactory=null;

privateDocumentdoc=null;

privateElementroot=null;

publicXMLSaver(){

factory=DocumentFactory.getInstance();

doc=factory.createDocument();

}

publicElementgenerateRoot(Stringname){

root=doc.addElement(name);

returnroot;

}

publicElementgenerateRoot(QNameqname){

root=doc.addElement(qname);

returnroot;

}

publicElementgenerateRoot(Elementelement){

doc.setRootElement(element);

root=element;

returnroot;

}

}

AddingInformationintoanElement

Element通过addElement()为自己增加一个子节点到当前所有子节点的后面。

该方法可以接受三种不同类型的参数:

(QNameqname)、(Stringname)或者(StringqualifiedName,StringnamespaceURI)。

该方法返回增加的子节点的Element对象。

Element通过addAttribute()为自己增加属性。

该方法可以接受两种不同类型的参数:

(QNameqname,Stringvalue)或者(Stringname,Stringvalue)。

该方法返回自身的Element对象。

Element通过addText()为自己增加文本内容。

该方法只接受String类型参数,并返回自身的Element对象。

publicvoidaddAuthors(ElementbookElement){

Elementauthor1=bookElement.addElement("author");

author1.addAttribute("name","Toby");

author1.addAttribute("location","Germany");

author1.addText("TobiasRademacher");

Elementauthor2=bookElement.addElement("author");

author2.addAttribute("name","James");

author2.addAttribute("name","UK");

author2.addText("JamesStrachan");

return;

}

DeletingElementsandAttributes

要删除XML树上的一棵子树,首先要找到该子树的根节点,然后对该节点调用detach()方法。

注意:

如果对根节点调用了detach()方法,将导致该XML树不再完整(一个XML文件需要有且仅有一个根节点)。

publicvoiddeleteSubtree(ElementsubtreeRoot){

subtreeRoot.detach();

return;

}

要清除Element下的所有子节点(包括Element和text),可以对该Element调用clearContent()方法。

该方法不会清除Element的属性。

要清除Element下的某个Attribute,首先要获得该Attribute对象,然后把它作为参数调用Element的remove()方法。

UpdatinganAttribute

要更新一个属性的内容,首先要获得该Attribute对象,然后可以调用setNamespace()方法更新它所属的namespace;调用setValue()方法更新它的属性值。

UpdatinganElement'sText

可以对一个Element对象调用isTextOnly()方法判断它是否只含有text或者是空节点。

对Element对象调用addText()方法将把一个字符串附加到Element中,但不会修改它原来拥有的text或者子节点。

如果Element是isTextOnly(),要修改原来含有的text,可以先调用clearContent(),再调用addText()并把新值传入。

publicvoidupdateText(Elementelement,StringnewText){

if(element.isTextOnly()){

element.clearContent();

element.addText(newText);

}

return;

}

ParsingXML

或许你想要做的第一件事情就是解析一个某种类型的XML文档,用dom4j很容易做到。

请看下面的示范代码:

import.URL;

importorg.dom4j.Document;

importorg.dom4j.DocumentException;

importorg.dom4j.io.SAXReader;

publicclassFoo{

publicDocumentparse(URLurl)throwsDocumentException{

SAXReaderreader=newSAXReader();

Documentdocument=reader.read(url);

returndocument;

}

}

使用迭代器(Iterators)

我们可以通过多种方法来操作XML文档,这些方法返回java里标准的迭代器(Iterators)。

例如:

publicvoidbar(Documentdocument)throwsDocumentException{

Elementroot=document.getRootElement();

//迭代根元素下面的所有子元素

for(Iteratori=root.elementIterator();i.hasNext();){

Elementelement=(Element)i.next();

//处理代码

}

//迭代根元素下面名称为"foo"的子元素

for(Iteratori=root.elementIterator("foo");i.hasNext();){

Elementfoo=(Element)i.next();

//处理代码

}

//迭代根元素的属性attributes)元素

for(Iteratori=root.attributeIterator();i.hasNext();){

Attributeattribute=(Attribute)i.next();

//dosomething

}

}

强大的XPath导航

在dom4j中XPath可以表示出在XML树状结构中的Document或者任意的节点(Node)(例如:

Attribute,Element或者ProcessingInstruction等)。

它可以使在文档中复杂的操作仅通过一行代码就可以完成。

例如:

publicvoidbar(Documentdocument){

Listlist=document.selectNodes("//foo/bar");

Nodenode=document.selectSingleNode("//foo/bar/author");

Stringname=node.valueOf("@name");

}

如果你想得到一个XHTML文档中的所有超文本链接(hypertextlinks)你可以使用下面的代码:

publicvoidfindLinks(Documentdocument)throwsDocumentException{

Listlist=document.selectNodes("//a/@href");

for(Iteratoriter=list.iterator();iter.hasNext();){

Attributeattribute=(Attribute)iter.next();

Stringurl=attribute.getValue();

}

}

如果你需要关于XPath语言的任何帮助,我们强烈推荐这个站点Zvontutorial他会通过一个一个的例子引导你学习。

快速遍历(FastLooping)

如果你不得不遍历一个非常大的XML文档,然后才去执行,我们建议你使用快速遍历方法(fastloopingmethod),它可以避免为每一个循环的节点创建一个迭代器对象,如下所示:

publicvoidtreeWalk(Documentdocument){

treeWalk(document.getRootElement());

}

publicvoidtreeWalk(Elementelement){

for(inti=0,size=element.nodeCount();i

Nodenode=element.node(i);

if(nodeinstanceofElement){

treeWalk((Element)node);

}

else{

//dosomething....

}

}

}

生成一个新的XML文档对象

在dom4j中你可能常常希望用程序生成一个XML文档对象,下面的程序为你进行了示范:

importorg.dom4j.Document;

importorg.dom4j.DocumentHelper;

importorg.dom4j.Element;

publicclassFoo{

publicDocumentcreateDocument(){

Documentdocument=DocumentHelper.createDocument();

Elementroot=document.addElement("root");

Elementauthor1=root.addElement("author")



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有